package com.yoouce.patchmng.util;

/**
 * Created by Scott.Lee on 15-10-13.
 */

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import org.apache.log4j.Logger;

/**
 *
 * SSH SCP上传工具类
 * <功能详细描述>
 *
 * @author  Scott.Lee
 * @version  [版本号, 2015年9月21日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class SCPUtil
{
    /**
     * 上传成功
     */
    private static final String SCP_UPLOAD_SUCCESS="200";

    /**
     * 上传失败
     */
    private static final String SCP_UPLOAD_FAILD="500";

    private static final Logger LOG = Logger.getLogger(SCPUtil.class);

    /*
     * scp ip地址
     */
    private String scpIp;

    /*
     * scp 端口号
     */
    private int scpPort;

    /*
     * scp 用户名
     */
    private String username;

    /*
     * scp 密码
     */
    private String password;

    private SCPClient scpClient = null;

    private Connection con = null;

    /**
     * 默认构造方法，加载系统配置的默认连接
     */

    public SCPUtil(String ip, Integer port, String userName, String password)
    {
        //scp ip地址
        this.scpIp = ip;
        //scp 端口号
        this.scpPort = port;
        //scp 用户名
        this.username = userName;
        //scp 密码
        this.password = password;
    }

    /**
     * 创建SSH SCP连接
     * <功能详细描述>
     * @throws Exception [参数说明]
     *
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    private void creatSCPConection() throws Exception
    {

        LOG.info("准备文件传输");
        //加入SCP实现远程传输文件
        con = new Connection(scpIp, scpPort);
        LOG.info("开始连接" + scpIp + ":" + scpPort);
        //连接
        con.connect();
        LOG.info("登陆远程服务器" + username);
        //登陆远程服务器的用户名密码
        boolean isAuthed = con.authenticateWithPassword(username, password);
        //登陆失败
        if (!isAuthed)
        {
            LOG.error("登陆远程服务器失败,用户名 密码错误");
            throw new Exception("登录失败");
        }

        //建立SCP客户端
        scpClient = con.createSCPClient();
        LOG.info("建立scp客户端");
    }

    /**
     * 方法功能说明：通过scp上传任何文件
     * <功能详细描述>
     * @param targetPath 文件上传的路径，
     * @param filePath 上传文件内容
     * @return String [返回类型说明]
     * @see [类、类#方法、类#成员]
     */
    public String upLoadFile(String targetPath, String filePath)
    {
        //建立连接
        try
        {
            creatSCPConection();
        }
        catch (Exception e1)
        {
            LOG.error("建立连接失败"+e1.getMessage());
            return "500";
        }


        try
        {
            LOG.info("开始上传【" + filePath + "】到【" + targetPath
                    + "】==============");
            //0755是指权限编号
            scpClient.put(filePath, targetPath, "0755");
            LOG.info("上传完成");
            return "200";
        }
        catch (Exception e)
        {
            LOG.error("上传失败");
            e.printStackTrace();
            return "500";
        }
        finally
        {
            LOG.info("关闭连接");
            con.close();
        }
    }

}
